package com.yz.restructure.chapter2.afterrestructure;

/**
 *  如果在参数内赋值，第一：降低了代码的清晰度，而且混用了按值传递和按引用传递这两种参数的传递方式，
 *  你可能想在参数内赋值，然后在函数外再使用参数的最新值，这是不可能的，JAVA只采用按值传递；
 *  第二：如果参数传递的是对象，那可以对“被传入的对象”进行一些相关操作，这是没问题的，
 *  在函数外可以更新最新值，但是如果在函数内重新对“被传入的对象”赋值，那就跟函数外的“调用对象”失去联系。
 *  做法：
 1.在第一次对参数赋值的地方，建立一个临时变量，把待处理的参数赋给它
 2.把之后对所有此参数的引用点，全部替换为此临时变量的引用
 3.修改赋值语句，使其改为对新建临时变量赋值。
 附带：如果代码的参数是传入对象的，请在函数调用后查看是否还有使用了这个对象，这极有可能造成函数执行的结果没有作用到对象上。
 如果需要返回的结果不止一个，可以试着把返回类型转成一个对象，把所有结果转为对象的变量；或者把一个函数拆分为多个函数，每个函数只返回一个结果
 * Created by Temp on 2017/9/13.
 */
public class Test {
    public static String printWithDate(Person arg) {
        return arg.toString();
    }

    public static void getC1(Person arg) {
        arg.setName("c1");
        arg.setAge(5);
        System.out.println("arg in nextDay:" + printWithDate(arg));
    }

    public static void getC2(Person arg) {
        arg = new Person();
        arg.setName("c2");
        arg.setAge(6);
        System.out.println("arg in nextDay:" + printWithDate(arg));
    }

    public static void main(String[] args) {

        Person c1 = new Person();
        getC1(c1);
        System.out.println("c1 after nextDay:" + printWithDate(c1));

        Person c2 = new Person();
        getC2(c2);
        System.out.println("c2 after nextDay:" + printWithDate(c2));
    }
}
